package 中等.哈希表;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * 给你用户在 LeetCode 的操作日志，和一个整数 k 。日志用一个二维整数
 * 数组 logs 表示，其中每个 logs[i] = [IDi, timei] 表示 ID 为 IDi
 * 的用户在 timei 分钟时执行了某个操作。
 * 多个用户 可以同时执行操作，单个用户可以在同一分钟内执行 多个操作 。
 * 指定用户的 用户活跃分钟数（user active minutes，UAM） 定义为用户
 * 对 LeetCode 执行操作的 唯一分钟数 。 即使一分钟内执行多个操作，也
 * 只能按一分钟计数。
 * 请你统计用户活跃分钟数的分布情况，统计结果是一个长度为 k 且 下标
 * 从 1 开始计数 的数组 answer ，对于每个 j（1 <= j <= k），answer[j]
 * 表示 用户活跃分钟数 等于 j 的用户数。
 * 返回上面描述的答案数组 answer 。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/finding-the-users-active-minutes
 */
public class 查找用户活跃分钟数_1817 {

    public static void main(String[] args) {

    }

    /**
     * 哈希表
     * 一个哈希表统计每个用户对应的活跃分钟数
     * 另外一个哈希表统计每个活跃分钟数对应的用户数量
     */
    public int[] findingUsersActiveMinutes(int[][] logs, int k) {
        int[] ans = new int[k];
        Map<Integer, Set<Integer>> map = new HashMap<>();

        for (int[] log : logs) {
            Set<Integer> set = map.getOrDefault(log[0], new HashSet<>());
            set.add(log[1]);
            map.put(log[0], set);
        }

        Map<Integer, Integer> map1 = new HashMap<>();

        for (Map.Entry<Integer, Set<Integer>> entry : map.entrySet()) {
            int minutes = entry.getValue().size();
            map1.put(minutes, map1.getOrDefault(minutes, 0) + 1);
        }

        for (Map.Entry<Integer, Integer> entry : map1.entrySet()) {
            ans[entry.getKey()] = entry.getValue();
        }

        return ans;
    }

}
